import db_students
import argparse
import sys
import os

class Programm:
    __parser = argparse.ArgumentParser(description="Скрипт конвертор")
    __all_response = False

    def __argument_declaration(self):
        self.__parser.add_argument("backup_1C_file",
        help="файл с выгрузкой 1C")
        self.__parser.add_argument("output_group_type",
        choices=["group","all"],
        help="выберите как заполнять готовые файлы. \
            group - группоровать записи по номеру группы. \
                all - выводить записи в \
                    изначальном порядке(максимальное \
                        количество уч. записей в файле = 249).")
        self.__parser.add_argument('--output_directory', default="csv",
        help="директорию куда будут выводиться конвертированные файлы.")
    

    def __init__(self):
        self.__argument_declaration()
        self.__arguments = self.__parser.parse_args()
    
    def __prepare_args(self):
        args = dict()
        args["backup"] = os.path.abspath(self.__arguments.backup_1C_file)
        
        if self.__arguments.output_group_type == "all":
            args["mode"] = False
        else:
            args["mode"] = True
        
        args["output_d"] = os.path.abspath(
            self.__arguments.output_directory
        )
        
        return args

    def __answer_user_true_false(self, question):
        if self.__all_response:
            return self.__all_response

        condition_plus = "\nОтветьте на вопрос Y/N или Д/Н. "
        response = False
        user_choice = ''

        while(
            not(
                (user_choice == "Д")
                or
                (user_choice == "Н")
                or
                (user_choice == "Y")
                or
                (user_choice == "N")
            )
        ):
            user_choice = input(question + condition_plus)
        
        if((user_choice == "Д") or (user_choice == "Y")):
            response = True
        
        return response
        

    def __check_dir_or_create(self, path):
        import shutil

        if os.path.isdir(path):
            question = "Удалить папку " +\
                path +\
                        " и создать новую?"
            response =\
                self.__answer_user_true_false(question)
            if response:
                shutil.rmtree(path)
            else:
                print("Скрипт остановлен перезапустите\
                    его с нужными параметрами")
                return False

        os.mkdir(path)
        return True
    
    def __check_file_exist(self, file, text_for_user):
        if not os.path.exists(file):
            print(text_for_user)
            raise SystemExit(1)

    def __main(self):
        args = self.__prepare_args()

        self.__check_file_exist(
            args.get("backup"),
            "Файл с выгрузкой не обнаружен."
        )

        if not self.__check_dir_or_create(
            args.get("output_d")
        ):
            raise SystemError(1)
        
        db = db_students.StudentsDB.StudentsDB(
                'bki',
                args.get("backup")
        )
        if args.get("mode"):
            db.groups_save_as_azure_csv_format(
                args.get("output_d")
            )
        else:
            db.default_save_as_azure_csv_format(
                args.get("output_d")
            )
    
    def start(self):
        self.__main()


if __name__ == "__main__":
    Programm().start()